package com.woniuxy.portal.config.runner;

import com.woniuxy.common.consts.BookConst;
import com.woniuxy.portal.service.BookService;
import com.woniuxy.portal.service.BookTypeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

/**
 * 首页图书分页查询的第一页 初始化操作
 * 实现CommandLineRunner接口，在 应用程序启动时 执行初始化逻辑
 */
@Component
@Slf4j
public class InitTopRunner implements CommandLineRunner {

    private final BookService bookService;
    private final BookTypeService bookTypeService;

    @Autowired
    public InitTopRunner(BookService bookService, BookTypeService bookTypeService) {
        this.bookService = bookService;
        this.bookTypeService = bookTypeService;
    }

    /**
     * 执行数据预热任务，解决缓存击穿问题
     * 该方法会在应用启动时自动调用，预先加载热门数据到缓存中
     *
     * @param args 可变参数数组，命令行参数
     * @throws Exception 执行过程中可能抛出的异常
     */
    @Override
    public void run(String... args) throws Exception {
        // 预加载热销图书数据到缓存
        bookService.findTopSale(BookConst.FIRST_PAGE, BookConst.PAGE_SIZE);
        // 预加载所有图书分类数据到缓存
        bookTypeService.findAllType();
        log.info("数据预热：解决缓存击穿问题（缓存没有，数据库有数据！）");
    }

}

/*
启动时执行，完成数据预热
解决：
    缓存击穿问题（缓存没有，数据库有数据）
面试：
    1、缓存击穿问题
    2、缓存穿透问题：缓存没有，数据库也没有数据：get -11111111（无效key，恶意攻击）
        每次往Redis中放keys的时候，存入一个集合：
        每次从Redis中根据key获取数据的时候，判断key是否存在集合中，不在集合中则返回null
        （解决：bitmap，布隆过滤器）
    3、缓存雪崩问题：
        缓存数据同时失效，导致缓存穿透问题，数据不存在，但是缓存中数据已经失效了
        大量的key同时失效，造成请求同时访问数据库，导致数据库压力过大，数据库崩溃，这种现象叫做缓存雪崩
        （简单理解：雪崩就是大量的击穿）
 */
